﻿
namespace SistemaLogistica.Windows.Forms.Adquisicion.Operaciones
{
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using EDOSwit.Controls.Helpers;
    using EDOSwit.Controls.Types;
    using EDOSwit.Controls.UserControls;
    using SistemaLogistica.Business.Entities;
    using SistemaLogistica.Business.Entities.Types;
    using SistemaLogistica.Business.Logic;
    using SistemaLogistica.Windows.Helpers;

    public partial class CwfOrdenPedido : MaestroDetalleSeguro
    {
        public CwfOrdenPedido()
        {
            InitializeComponent();
        }

        protected override void LoadPermisos()
        {
            this.TsMenu.Permisos.AddRange(Metodos.GetPermisos(Convert.ToByte(this.Tag)));
        }

        protected override void FocusKeyPress(object sender, KeyPressEventArgs e)
        {
            base.FocusKeyPress(sender, e);
        }

        private void dtpFechaBusqueda_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                this.MaestroBindingSource.DataSource = OrdenPedidoManager.Instancia.Buscar(this.dtpFechaBusqueda.Value);
                this.dgvMaestro.DataSource = this.MaestroBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
        }

        protected override void CellPainting(ref DataGridViewCellPaintingEventArgs e)
        {
            Graphics g = e.Graphics;
            bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
            Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
            Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
            Font font = e.CellStyle.Font;
            font = new Font("Tahoma", 7);

            OrdenPedido ordenPedido = this.MaestroBindingSource[e.RowIndex] as OrdenPedido;

            if (ordenPedido != null)
            {
                int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                y = y + height - 1;

                if (e.ColumnIndex == 0)
                {
                    font = new Font("Tahoma", 8, FontStyle.Bold);

                    if (selected)
                        TextRenderer.DrawText(e.Graphics, "Nº: " + ordenPedido.IdOrdenPedido.ToString().PadLeft(7, '0'), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    else
                        TextRenderer.DrawText(e.Graphics, "Nº: " + ordenPedido.IdOrdenPedido.ToString().PadLeft(7, '0'), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                    font = new Font("Tahoma", 8);
                    y = y + height - 1;
                    TextRenderer.DrawText(e.Graphics, ordenPedido.Pedido.Area.Nombre, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                }
                else
                {
                    font = new Font("Tahoma", 9, FontStyle.Bold);
                    if (selected)
                        TextRenderer.DrawText(e.Graphics, ordenPedido.Fecha.ToShortDateString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    else
                        TextRenderer.DrawText(e.Graphics, ordenPedido.Fecha.ToShortDateString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                    font = new Font("Tahoma", 7);
                    y = y + height - 1;
                    TextRenderer.DrawText(e.Graphics, Enum.GetName(typeof(PedidoType), ordenPedido.TipoOrdenPedido), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                }
            }
        }

        private void cmbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cmbTipo.SelectedIndex != -1)
            {
                try
                {
                    PedidoType type = (PedidoType)Enum.Parse(typeof(PedidoType), this.cmbTipo.SelectedIndex.ToString());
                    this.cmbPedido.DataSource = PedidoManager.Instancia.ListarPorTipo(type);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
                }
            }
            else
            {
                this.dgvDetalle.Rows.Clear();
            }
            cmbPedido_SelectedIndexChanged(sender, EventArgs.Empty);
        }

        private void cmbPedido_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cmbPedido.SelectedIndex != -1)
            {
                Pedido pedido = PedidoManager.Instancia.ObtenerPorID(Convert.ToInt32(this.cmbPedido.SelectedValue));
                this.txtDescripcion.Text = pedido.Descripcion;

                int index = 0;
                this.dgvDetalle.Rows.Clear();
                foreach (DetallePedido d in pedido.Detalle)
                {
                    index = this.dgvDetalle.Rows.Add(1);
                    this.dgvDetalle.Rows[index].Cells[0].Value = d.IdBien;
                    this.dgvDetalle.Rows[index].Cells[1].Value = d.Descripcion;
                    this.dgvDetalle.Rows[index].Cells[2].Value = Convert.ToInt32(d.Cantidad);
                    this.dgvDetalle.Rows[index].Cells[3].Value = false;
                }
            }
            else
            {
                this.dgvDetalle.Rows.Clear();
            }
        }

        private void dgvDetalle_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (this.dgvDetalle.CurrentCell != null)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, this.Titulo, "¿Desea eliminar el Detalle?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.dgvDetalle.Rows.Remove(this.dgvDetalle.CurrentRow);
                        this.dgvDetalle.Focus();
                    }
                }
            }
        }

        protected override void InitialLoad()
        {
            try
            {
                this.cmbPedido.DisplayMember = "IdPedido";
                this.cmbPedido.ValueMember = "IdPedido";
                this.cmbPedido.DisplayColumnNames = "IdPedido,Fecha,Area,Estado";

                this.cmbTipo.DataSource = Enum.GetNames(typeof(PedidoType));
                this.cmbEstado.DataSource = Enum.GetNames(typeof(AtencionType));

                this.MaestroBindingSource.DataSource = OrdenPedidoManager.Instancia.Listar();
                this.dgvMaestro.DataSource = this.MaestroBindingSource;
                OcultarColumnas();
                ClearControls();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
        }

        private void OcultarColumnas()
        {
            this.dgvMaestro.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dgvMaestro.Columns["Empleados"].Visible = false;
            this.dgvMaestro.Columns["Pedido"].Visible = false;
            this.dgvMaestro.Columns["Estado"].Visible = false;
            this.dgvMaestro.Columns["Descripcion"].Visible = false;
            this.dgvMaestro.Columns["TipoOrdenPedido"].Visible = false;
            this.dgvMaestro.Columns["IdOrdenPedido"].HeaderText = "Ordenes";
        }

        protected override void EventoNuevo()
        {
            this.dgvDetalle.ReadOnly = false;
            this.cmbEstado.SelectedIndex = (int)AtencionType.EnEspera;
            this.cmbEstado.Enabled = false;
            this.dtpFecha.Enabled = false;
            this.dtpFecha.Value = EmpresaManager.Instancia.Fecha();
            this.dtpFecha.Focus();
        }

        protected override void EventoEditar()
        {
            this.dgvDetalle.ReadOnly = false;
            this.cmbEstado.Enabled = true;
            this.dtpFecha.Enabled = true;
            this.dtpFecha.Focus();
        }

        protected override void EventoGuardar()
        {
            this.dgvDetalle.ReadOnly = true;
        }

        protected override void EventoCancelar()
        {
            this.dgvDetalle.ReadOnly = true;
        }

        protected override void LoadData(object obj)
        {
            OrdenPedido ordenPedido = obj as OrdenPedido;
            if (ordenPedido != null)
            {
                ordenPedido = OrdenPedidoManager.Instancia.ObtenerPorID(ordenPedido.IdOrdenPedido);

                this.identificador = ordenPedido.IdOrdenPedido;
                this.dtpFecha.Value = ordenPedido.Fecha;
                this.cmbTipo.SelectedIndex = ordenPedido.TipoOrdenPedido;
                this.cmbPedido.SelectedValue = ordenPedido.Pedido.IdPedido;
                this.txtDescripcion.Text = ordenPedido.Descripcion;
                this.cmbEstado.SelectedIndex = Convert.ToInt32(ordenPedido.Estado);

                this.dgvDetalle.Rows.Clear();
                foreach (DetallePedido d in ordenPedido.Pedido.Detalle)
                {
                    int index = this.dgvDetalle.Rows.Add(1);
                    this.dgvDetalle.Rows[index].Cells[0].Value = d.IdBien;
                    this.dgvDetalle.Rows[index].Cells[1].Value = d.Descripcion;
                    this.dgvDetalle.Rows[index].Cells[2].Value = Convert.ToInt32(d.Cantidad);
                    this.dgvDetalle.Rows[index].Cells[3].Value = false;
                }
                foreach (DetalleOrdenPedido d in ordenPedido.Detalle)
                {
                    foreach (DataGridViewRow row in this.dgvDetalle.Rows)
                    {
                        if (Convert.ToInt32(row.Cells[0].Value) == d.IdBien)
                        {
                            row.Cells[0].Value = d.IdBien;
                            row.Cells[1].Value = d.Descripcion;
                            row.Cells[2].Value = Convert.ToInt32(d.Cantidad);
                            row.Cells[3].Value = true;
                            break;
                        }
                    }
                }
            }
        }

        protected override bool SaveData()
        {
            bool result = false;
            int posicion = this.MaestroBindingSource.Position;

            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        OrdenPedidoManager.Instancia.Registrar(GetOrdenPedido());
                        break;
                    case EstadoActual.Editar:
                        OrdenPedidoManager.Instancia.Modificar(GetOrdenPedido());
                        break;
                    case EstadoActual.Eliminar:
                        OrdenPedidoManager.Instancia.Eliminar(Convert.ToInt32(this.identificador));
                        this.MaestroBindingSource.RemoveCurrent();
                        posicion -= 1;
                        break;
                }
                result = true;
                InitialLoad();
                this.MaestroBindingSource.Position = posicion;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
            return result;
        }

        private OrdenPedido GetOrdenPedido()
        {
            OrdenPedido ordenPedido = new OrdenPedido
            {
                IdOrdenPedido = Convert.ToInt32(this.identificador),
                Fecha = this.dtpFecha.Value,
                Empleados = new Empleados { IdEmpleado = Empresa.Usuario.IdEmpleado },
                Pedido = new Pedido { IdPedido = Convert.ToInt32(this.cmbPedido.SelectedValue) },
                TipoOrdenPedido = this.cmbTipo.SelectedIndex,
                Descripcion = this.txtDescripcion.Text,
                Estado = Convert.ToBoolean(this.cmbEstado.SelectedIndex)
            };
            foreach (DataGridViewRow row in this.dgvDetalle.Rows)
            {
                if (ValidateData(row.Index) && Convert.ToBoolean(row.Cells[3].Value))
                {
                    ordenPedido.Detalle.Add(new DetalleOrdenPedido
                    {
                        IdBien = Convert.ToInt32(row.Cells[0].Value),
                        Descripcion = row.Cells[1].Value.ToString(),
                        Cantidad = Convert.ToDecimal(row.Cells[2].Value)
                    });
                }
            }
            return ordenPedido;
        }

        private bool ValidateData(int rowIndex)
        {
            bool result = true;

            if (this.dgvDetalle.Rows[rowIndex].Cells[0].Value == null)
            {
                result = false;
            }
            if (this.dgvDetalle.Rows[rowIndex].Cells[1].Value == null)
            {
                result = false;
            }
            if (this.dgvDetalle.Rows[rowIndex].Cells[2].Value == null)
            {
                result = false;
            }
            return result;
        }

        protected override bool ValidateData()
        {
            bool result = true;

            if (this.cmbTipo.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbTipo, "Seleccionar Tipo de Pedido.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbTipo, string.Empty);
            }
            if (this.cmbPedido.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbPedido, "Seleccionar el Pedido.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbPedido, string.Empty);
            }
            if (this.cmbEstado.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbEstado, "Seleccionar Estado.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbEstado, string.Empty);
            }
            if (this.dgvDetalle.Rows.Count == 0)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, "No existe bienes para realizar la Orden.");
                result = false;
            }
            return result;
        }

        protected override void ClearControls()
        {
            this.identificador = 0;
            this.dgvDetalle.Rows.Clear();
            base.ClearControls();
        }
    }
}
